package slogx

import (
	"io"
	"log/slog"
	"os"
	"sync"
)

var (
	loggerMutex sync.Mutex
	global      *slog.Logger
)

// Config 定义 slogx 的初始化配置
type Config struct {
	Level      slog.Leveler
	Format     string // "json" or "text"
	FilePath   string // 日志文件路径（为空则不写文件）
	AddSource  bool   // 是否显示调用源
	WithStdout bool   // 是否输出到终端
}

// Setup 初始化或更新全局 logger（线程安全，可多次调用）
func Setup(cfg Config) {
	loggerMutex.Lock()
	defer loggerMutex.Unlock()
	global = newLogger(cfg)
}

// L 返回当前全局 logger（若未初始化则使用默认配置）
func L() *slog.Logger {
	loggerMutex.Lock()
	defer loggerMutex.Unlock()

	if global == nil {
		global = newLogger(Config{
			Level:      slog.LevelInfo,
			Format:     "text",
			WithStdout: true,
		})
	}
	return global
}

// SetWriter 替换输出目标（例如用于测试）
func SetWriter(w io.Writer) {
	loggerMutex.Lock()
	defer loggerMutex.Unlock()
	global = slog.New(slog.NewTextHandler(w, nil))
}

// newLogger 创建新的 slog.Logger
func newLogger(cfg Config) *slog.Logger {
	opts := &slog.HandlerOptions{
		AddSource: cfg.AddSource,
		Level:     cfg.Level,
	}

	var handlers []slog.Handler

	// 文件输出
	if cfg.FilePath != "" {
		f := NewRotatingWriter(cfg.FilePath)
		if cfg.Format == "json" {
			handlers = append(handlers, slog.NewJSONHandler(f, opts))
		} else {
			handlers = append(handlers, slog.NewTextHandler(f, opts))
		}
	}

	// 控制台输出
	if cfg.WithStdout {
		if cfg.Format == "json" {
			handlers = append(handlers, slog.NewJSONHandler(os.Stdout, opts))
		} else {
			handlers = append(handlers, slog.NewTextHandler(os.Stdout, opts))
		}
	}

	var handler slog.Handler
	if len(handlers) == 1 {
		handler = handlers[0]
	} else {
		handler = NewMultiHandler(handlers...)
	}

	return slog.New(handler)
}
